/*
 * CAnimation.h
 *
 *  Created on: 07.04.2012
 *      Author: caffeine
 *
 *      Модуль хранит в себе информацию о наборе анимаций. Например
 *      может хранить анимацию бега, стойки, атаки и т.п. для одной из расс.
 */

#ifndef ANIMATION_H_
#define ANIMATION_H_

#include <lampe/animation/IAnimation.h>

namespace lampe{
namespace animation{


class CAnimationRecord;

/***
 * @class CAnimation
 * Хранит в себе информацию о группе анимаций. Пример: группа анимаций это
 * все анимации пренадлежащие одной рассе и полу
 */
class CAnimation:public IAnimation{
private:
	irr::scene::ISceneManager*manager;
	irr::scene::ISkinnedMesh*mesh;
	irr::core::array<CAnimationRecord*>records;
	bool locked;
	irr::u32 frameCount;
	bool needCreateBone;
    lampe::String name;
public:

	/***
	 * Возвращяет имя группы анимаций
	 *
	 * @return имя группы анимаций
	 */
    virtual lampe::String getName();

    virtual void setName(lampe::String name);

	/***
	 * Находит анимацию по её имяни
	 *
	 * @param name имя анимации, которую нужно найти
	 * @return номер анимации. Если анимация не найдена, то вернёт -1
	 */
    virtual irr::s32 indexOf(lampe::String name);

	/***
	 * Возвращяет анимацию по её номеру
	 *
	 * @param index номер анимации
	 * @return анимация. Если анимация не найдена, то верёт null
	 */
	virtual IAnimationRecord*getAnimationByIndex(irr::u32 index);

	/***
	 * Находит и возвращяет анимацию по её имини. Если не найдена, то вернёт NULL
	 *
	 * @param name название анимции
	 * @return анимация, имеющее указанное имя. Если анимация с указанным имянем не найдена, то вернёт NULL
	 */
    virtual IAnimationRecord*getAnimationByName(lampe::String name);

	/***
	 * Возвращяет созданы ли уже кости
	 *
	 * @return TRUE если кости созданы, иначе FALSE
	 */
	virtual bool getNeedCreateBone();

	/***
	* Возвращяет номер записи по её указателю
	*
	* @param animation Анимация, которую нужно найти
	* @return номер указанной анимации в списке. Если не найдена, то вернёт -1
	* */
	virtual irr::s32 indexOfRecord(IAnimationRecord*animation);

	/***
	 * Возвращяет меш, в котором хранится супер-анимация
	 *
	 * @return итоговая супер-анимация
	 */
	virtual irr::scene::ISkinnedMesh*getMesh();

	/***
	 * Добавляет анимацию из меша в группу анимаций
	 *
	 * @param a меш анимации
	 * @param name имя меша
	 * */
	virtual IAnimationRecord*addAnimationFromMesh(irr::scene::ISkinnedMesh*a,String name);
	
	/***
	* Добовляет анимацию из файла в группу анимаций
	*
	* @param filename путь к файлу с анимацией
	* @param name название анимации (то как оно будет хранится в группе анимаций)
	* */
    virtual IAnimationRecord*addAnimationFromFile(boost::filesystem::path,lampe::String name);

	/***
	 * Применяет анимацию к моделе
	 *
	 * @param name имя анимации (например run)
	 * @param node узел-модель к которой нужно применить анимацию
	 */
    virtual void useFor(lampe::String name,irr::scene::IAnimatedMeshSceneNode*node);
	
	
	/***
	* Устанавливает модели источник анимации на текущий. т.е. фактический заставляет модель проигрывать
	* именно текущую группу анимаций. Перед началом вызовов useFor(...) обязательно нужно вызвать этот метод,
	* иначе вызов useFor(...) никчиму не приведёт.
	*
	* @param node узел, которому нужно устанавить анимационную группу
	* */
	virtual void useAnimation(irr::scene::IAnimatedMeshSceneNode*node);
	
	/***
	 * Конструктор
	 *
	 * @param имя группы анимаций
	 * @param m менаджер сцены, где нужно работать
	 */
    CAnimation(lampe::String name,irr::scene::ISceneManager*manager);
	
	virtual ~CAnimation();
};



}//namespace animation
}//namespace irr
#endif /* ANIMATION_H_ */
